热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

对于每个UPDATE,INSERTElsewhere存储过程-ForEachUPDATE,INSERTElsewhereStoredProcedure

Itmaybethecasethisisonlypossiblethroughlooping,butwhoknows.可能是这种情况只能通过循环来实现,但谁知道呢。I

It may be the case this is only possible through looping, but who knows.

可能是这种情况只能通过循环来实现,但谁知道呢。

I'm in a Java coding environment using MS SQL Server, and I have been searching around and can't seem to find a good way to INSERT records in say a transaction history table that we must keep updated for every action done in other tables upon issuing a single UPDATE command to UPDATE many records. For each UPDATE record updated, I would like to do an insert statement as well Essentially this is what we currently do, one by one, in code not using a stored procedure:

我在使用MS SQL Server的Java编码环境中,我一直在搜索并且似乎找不到一个很好的方法来插入记录,比如说一个事务历史表,我们必须为其他表中的每个操作保持更新在发出单个UPDATE命令来更新许多记录时。对于更新的每个UPDATE记录,我想做一个插入语句本质上这是我们目前在不使用存储过程的代码中一个接一个地做的事情:

UPDATE table SET column1=null, column2=null, column3=0, column4=getDate() where column5=? and column6=1
...
//Insert transtable
createTransaction(tran, localConn);
...
INSERT INTO transtable ( a, b, c, d, e, f, g, h, i, " +
                 "j, k, l, m, n, o, p, q, r, s, " +
                 "t, u, v, w) " +
                 " VALUES ( ? ,? ,? ,? ,? ,? ,getDate() ,getDate() ,getDate() ,? ,? ,? ,? ,? ,? ,? ,getDate() ,getDate(),? ,? ,? ,?,? )

What I would like to do, is something like this instead for the UPDATE:

我想做的是这样的事情而不是UPDATE:

USE [DB]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

ALTER PROCEDURE [dbo].[setFlags]
AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;

UPDATE table1
SET column1 = '2', column2 = NULL
WHERE column1 = '1' or column1 = '2'
--FOR EACH UPDATED ROW IN THIS TABLE, CREATE A TRANSACTION IN TRANSTABLE

UPDATE table2
SET column1 = '0', column2 = NULL
WHERE column1 = '1'
--FOR EACH UPDATED ROW IN THIS TABLE, CREATE A TRANSACTION IN TRANSTABLE

UPDATE table3
SET column1 = '0', column2 = NULL
WHERE column1 = '1'
--FOR EACH UPDATED ROW IN THIS TABLE, CREATE A TRANSACTION IN TRANSTABLE

END

However, for each record updated (usually about ~100 records would be updated using this utility), about 100 INSERTs need to be done as well in our transtable table, which will also contain some of the data from the rows being updated.

但是,对于每个更新的记录(通常使用此实用程序将更新约100条记录),在我们的transtable表中也需要完成大约100个INSERT,它还将包含正在更新的行中的一些数据。

Does anyone have any ideas? Resources out there? Etc.? I'm somewhat of a beginner, so sometimes I just don't know what to search for. Lately I've been searching "for each UPDATE INSERT SQL" or "looping insert for each update"

有没有人有任何想法?有资源吗?等等。?我有点像初学者,所以有时我只是不知道要搜索什么。最近我一直在搜索“每个UPDATE INSERT SQL”或“每个更新的循环插入”

I might need to do WHILE TSQL, but if there is a better way (it also sounds terribly inefficient), that'd be great to know: http://msdn.microsoft.com/en-us/library/ms178642.aspx

我可能需要做TSILE,但如果有更好的方法(它听起来也非常低效),那就太棒了:http://msdn.microsoft.com/en-us/library/ms178642.aspx

2 个解决方案

#1


2  

You don't tell what version of SQL Server you are using, neither what edition. If you are on 2008 Enterprise edition, have a look at Change Data Capture. There is a good introduction article here.

您没有告诉您使用的SQL Server版本,也不知道版本是什么。如果您使用的是2008 Enterprise Edition,请查看Change Data Capture。这里有一篇很好的介绍文章。

#2


1  

Probably the best solution for your situation is to use a trigger, as MSDN defines: "A trigger is a special kind of stored procedure that automatically executes when an event occurs in the database server.".

对于您的情况,最好的解决方案可能是使用触发器,因为MSDN定义:“触发器是一种特殊的存储过程,在数据库服务器中发生事件时自动执行。”

The following script creates two tables on tempdb: mydatanow and mydatalog. The trigger makelog runs every time a row is inserted or updated into mydatanow and its implementations copies all rows inserted into mydatanow to mydatalog -- if more than one row is affected by an update statement, all rows are copied.

以下脚本在tempdb上创建两个表:mydatanow和mydatalog。每次插入行或更新到mydatanow时,触发器makelog都会运行,并且其实现会将插入mydatanow的所有行复制到mydatalog - 如果多行受到update语句的影响,则会复制所有行。

USE tempdb;
GO
CREATE TABLE mydatanow (id SMALLINT, c1 VARCHAR(10), c2 VARCHAR(10));
CREATE TABLE mydatalog (id SMALLINT, c1 VARCHAR(10), c2 VARCHAR(10), moment DATETIME);
GO
CREATE TRIGGER makelog ON mydatanow
AFTER INSERT, UPDATE
AS BEGIN
    INSERT mydatalog(id, c1, c2, moment)
    SELECT id, c1, c2, GETDATE()
    FROM inserted
END
GO
INSERT mydatanow VALUES (1, 'abe', 'apple');
INSERT mydatanow VALUES (2, 'beth', 'banana');
UPDATE mydatanow SET c1 = 'carl', c2 = 'no fruit';
GO
SELECT * FROM mydatanow;
-- id     c1         c2
-- ------ ---------- ----------
-- 1      carl       no fruit
-- 2      carl       no fruit

SELECT * FROM mydatalog;
-- id     c1         c2         moment
-- ------ ---------- ---------- -----------------------
-- 1      abe        apple      2012-05-10 19:36:45.843
-- 2      beth       banana     2012-05-10 19:36:45.843
-- 1      carl       no fruit   2012-05-10 19:36:45.847
-- 2      carl       no fruit   2012-05-10 19:36:45.847

推荐阅读
  • 本文介绍了一个在线急等问题解决方法,即如何统计数据库中某个字段下的所有数据,并将结果显示在文本框里。作者提到了自己是一个菜鸟,希望能够得到帮助。作者使用的是ACCESS数据库,并且给出了一个例子,希望得到的结果是560。作者还提到自己已经尝试了使用"select sum(字段2) from 表名"的语句,得到的结果是650,但不知道如何得到560。希望能够得到解决方案。 ... [详细]
  • 本文介绍了数据库的存储结构及其重要性,强调了关系数据库范例中将逻辑存储与物理存储分开的必要性。通过逻辑结构和物理结构的分离,可以实现对物理存储的重新组织和数据库的迁移,而应用程序不会察觉到任何更改。文章还展示了Oracle数据库的逻辑结构和物理结构,并介绍了表空间的概念和作用。 ... [详细]
  • 如何使用Java获取服务器硬件信息和磁盘负载率
    本文介绍了使用Java编程语言获取服务器硬件信息和磁盘负载率的方法。首先在远程服务器上搭建一个支持服务端语言的HTTP服务,并获取服务器的磁盘信息,并将结果输出。然后在本地使用JS编写一个AJAX脚本,远程请求服务端的程序,得到结果并展示给用户。其中还介绍了如何提取硬盘序列号的方法。 ... [详细]
  • 本文介绍了在Mac上搭建php环境后无法使用localhost连接mysql的问题,并通过将localhost替换为127.0.0.1或本机IP解决了该问题。文章解释了localhost和127.0.0.1的区别,指出了使用socket方式连接导致连接失败的原因。此外,还提供了相关链接供读者深入了解。 ... [详细]
  • MyBatis多表查询与动态SQL使用
    本文介绍了MyBatis多表查询与动态SQL的使用方法,包括一对一查询和一对多查询。同时还介绍了动态SQL的使用,包括if标签、trim标签、where标签、set标签和foreach标签的用法。文章还提供了相关的配置信息和示例代码。 ... [详细]
  • 本文详细介绍了SQL日志收缩的方法,包括截断日志和删除不需要的旧日志记录。通过备份日志和使用DBCC SHRINKFILE命令可以实现日志的收缩。同时,还介绍了截断日志的原理和注意事项,包括不能截断事务日志的活动部分和MinLSN的确定方法。通过本文的方法,可以有效减小逻辑日志的大小,提高数据库的性能。 ... [详细]
  • 目录实现效果:实现环境实现方法一:基本思路主要代码JavaScript代码总结方法二主要代码总结方法三基本思路主要代码JavaScriptHTML总结实 ... [详细]
  • 本文介绍了Java工具类库Hutool,该工具包封装了对文件、流、加密解密、转码、正则、线程、XML等JDK方法的封装,并提供了各种Util工具类。同时,还介绍了Hutool的组件,包括动态代理、布隆过滤、缓存、定时任务等功能。该工具包可以简化Java代码,提高开发效率。 ... [详细]
  • Oracle Database 10g许可授予信息及高级功能详解
    本文介绍了Oracle Database 10g许可授予信息及其中的高级功能,包括数据库优化数据包、SQL访问指导、SQL优化指导、SQL优化集和重组对象。同时提供了详细说明,指导用户在Oracle Database 10g中如何使用这些功能。 ... [详细]
  • 使用Ubuntu中的Python获取浏览器历史记录原文: ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • 基于事件驱动的并发编程及其消息通信机制的同步与异步、阻塞与非阻塞、IO模型的分类
    本文介绍了基于事件驱动的并发编程中的消息通信机制,包括同步和异步的概念及其区别,阻塞和非阻塞的状态,以及IO模型的分类。同步阻塞IO、同步非阻塞IO、异步阻塞IO和异步非阻塞IO等不同的IO模型被详细解释。这些概念和模型对于理解并发编程中的消息通信和IO操作具有重要意义。 ... [详细]
  • 本文讨论了在数据库打开和关闭状态下,重新命名或移动数据文件和日志文件的情况。针对性能和维护原因,需要将数据库文件移动到不同的磁盘上或重新分配到新的磁盘上的情况,以及在操作系统级别移动或重命名数据文件但未在数据库层进行重命名导致报错的情况。通过三个方面进行讨论。 ... [详细]
  • 本文详细介绍了MySQL表分区的创建、增加和删除方法,包括查看分区数据量和全库数据量的方法。欢迎大家阅读并给予点评。 ... [详细]
  • 前景:当UI一个查询条件为多项选择,或录入多个条件的时候,比如查询所有名称里面包含以下动态条件,需要模糊查询里面每一项时比如是这样一个数组条件:newstring[]{兴业银行, ... [详细]
author-avatar
手机用户2602935395
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有